// 实现localStorage的单例
/** 构建单件设计模式【懒汉式】（等到需要使用对象时才创建对象，按需创建）
 * 第一步：把构造器设置为私有的，不允许外部来创建类的实例
  第二步：至少应该提供一个外部访问的方法或属性，外部可以通过这个方法或属性来得到一个对象，所以应该把这个方法设置为静态方法
  第三步：外部调用第二步提供的静态方法来获取一个对象
**/
class MyLocalStorage{
  static localstorage: MyLocalStorage // 静态属性
  private constructor(){
    console.log('这是TS的单例模式的静态方法的构造器')
  }

  public static getInstance() {
    if (!this.localstorage) {
      this.localstorage = new MyLocalStorage()
    }
    return this.localstorage
  }
  // 保存key-value
  public setItem(key: string, value:any) {
    localStorage.setItem(key, JSON.stringify(value))
  }
  public getItem(key: string) {
    let value = localStorage.getItem(key)
    return value != null ? JSON.parse(value) : null
  }
}

MyLocalStorage.getInstance()
MyLocalStorage.getInstance()


/**
 * 构建单件设计模式【饿汉式】（立即创建对象）
第一步：把构造器设置为私有的，不允许外部来创建类的实例
第二步：建立一个静态引用属性，同时把这个引用属性直接指向一个对象，【new MyLocalStorage】
第三步：外部调用第二步提供的静态方法来获取一个对象
**/
class MyLocalStorage2{
  // 对象属性【对象的基本类型属性和对象的引用属性】
  static localstorage: MyLocalStorage2 = new MyLocalStorage2()
  private constructor(){
    console.log('这是TS的单例模式的静态方法的构造器2')
  }
}

// 什么都不做，控制台就会打印console.log方法